#include "TaskQueue.h"

#include <thread>

using std::unique_lock;

TaskQueue::TaskQueue(int capa)
    :_capacity(capa)
    ,_mt()
    ,_que()
    ,_cvproducer()
     ,_cvconsumer()
{

}

TaskQueue::~TaskQueue(){

}

void TaskQueue::push(ElemType ptask){
    unique_lock<mutex> ul(_mt);
    /* if(full()){ */ //虚假唤醒
    while(full()){
        _cvproducer.wait(ul);//当这个_cvproducer被唤醒之后
                             //会从这个wait这个位置往后面走
                             //如果是if()条件语句的话就不需要再进行判断
                             //当多个生产者或者多个消费者，就会出现重复push或者pop
                             //这叫做虚假唤醒
                             //如果是while()语句就需要重新走到while判断语句中
                             //如果条件不满足，就不会继续下去
    }
    _que.push(ptask);
    _cvconsumer.notify_one();

}

ElemType TaskQueue::pop(){
    unique_lock<mutex> ul(_mt);
    /* if(empty()){ */
    while(empty()){
        _cvconsumer.wait(ul);
    }
    ElemType cnumber = _que.front();
    _que.pop();
    _cvproducer.notify_one();
    return cnumber;
}

bool TaskQueue::empty()const{
    if(_que.size() == 0){
        return true;
    }else{
        return false;
    }
}

bool TaskQueue::full()const{
    if(_capacity == _que.size()){
        return true;
    }else{
        return false;
    }
}
